package com.trg.generaltool.service;

import com.rabbitmq.client.*;
import com.trg.generaltool.util.rabbitmq.RabbitmqUtil;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @ClassName: Provider
 * @Description: 方法一、直接连接queue的方式
 * @Author: tangrg
 * @Date: 2021/7/16 10:32
 * @Version: 1.0
 * @Return:
 **/

@Service
public class RabbitMq {

    /**
     * 生产者
     */
    public void provider() {
        //*****获取通道发送消息
        try {
            Connection connection = RabbitmqUtil.getConnect();
            Channel channel = connection.createChannel();
            //***通道绑定对应的消息队列
            /**
             * 参数一：队列名称，（不存在则创建）
             * 参数二：durable  定义当前队列是否要开启持久化 true开启(注意，这里是只持久化队列，和消息没关系的)
             * 参数三：exclusive   是否独占队列（如果为true，表示当前队列只能由一个消费者消费）
             * 参数四：autoDelete   是否在消费完成后删除删除该队列
             * 参数五：arguments     额外附加参数
             *
             */
            channel.queueDeclare("hello", true, false, false, null);

            /**
             * 发送消息相关的设置
             * String var1, exchange 交换机名称
             * String var2,routingKey 队列名称
             * boolean var3,mandatory 传递消息额外设置
             *  MessageProperties.PERSISTENT_TEXT_PLAIN    表示持久化消息
             * byte[] var6  要发送的内容
             */
            for (int i = 0; i < 10; i++) {

                channel.basicPublish("", "hello", MessageProperties.PERSISTENT_TEXT_PLAIN, (i + "hello rabbitmq").getBytes());
            }

            RabbitmqUtil.closeConnect(connection, channel);

            System.out.println("发送消息成功！");

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 消费者
     */
    public void consumer() {

        try {
            Connection connection = RabbitmqUtil.getConnect();
            Channel channel = connection.createChannel();
            channel.queueDeclare("hello", true, false, false, null);

            channel.basicConsume("hello", true, new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    System.out.println("当前消费信息：" + new String(body));
                }
            });
            //消费者要一直监听，不建议直接关闭
//            channel.close();
//            connection.close();

            System.out.println("消费成功！");

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    //注意，这里写main函数的主要目的是让消费者一直去监听，如果有消息就自动的消费掉
    public static void main(String[] args) {
        RabbitMq rabbitMq = new RabbitMq();
        rabbitMq.consumer();
    }
}
